#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#include    <sys/types.h>
#include    <sys/stat.h>
#include    <dirent.h>

ino_t   get_inode(char *);
void    printpathto(ino_t);
void    inum_to_name(ino_t , char *, int );

int main()
{
printpathto( get_inode( "." ) );    
putchar('\n');              
return 0;
}

void printpathto( ino_t this_inode )
{
ino_t   my_inode ;
char    its_name[BUFSIZ];

if ( get_inode("..") != this_inode )
{
chdir( ".." );

inum_to_name(this_inode,its_name,BUFSIZ);

my_inode = get_inode( "." );        
printpathto( my_inode );        
printf("/%s", its_name );
}
}

void inum_to_name(ino_t inode_to_find , char *namebuf, int buflen)
{
DIR     *dir_ptr;       
struct dirent   *direntp;

dir_ptr = opendir( "." );
if ( dir_ptr == NULL )
{
perror( "." );
exit(1);
}

while ( ( direntp = readdir( dir_ptr ) ) != NULL )
if ( direntp->d_ino == inode_to_find )
{
strncpy( namebuf, direntp->d_name, buflen);
namebuf[buflen-1] = '\0';
closedir( dir_ptr );
return;
}
fprintf(stderr, "error looking for inum %d\n", (int) inode_to_find);
exit(1);
}

ino_t get_inode( char *fname )
{
struct stat info;

if ( stat( fname , &info ) == -1 )
{
fprintf(stderr, "Cannot stat ");
perror(fname);
exit(1);
}
return info.st_ino;
}
